.\"
.\" This file and its contents are supplied under the terms of the
.\" Common Development and Distribution License ("CDDL"), version 1.0.
.\" You may only use this file in accordance with the terms of version
.\" 1.0 of the CDDL.
.\"
.\" A full copy of the text of the CDDL should have accompanied this
.\" source.  A copy of the CDDL is also available via the Internet at
.\" http://www.illumos.org/license/CDDL.
.\"
.\"
.\" Copyright (c) 2015, Joyent, Inc. All Rights Reserved.
.\"
.Dd February 17, 2023
.Dt TIMERFD 3C
.Os
.Sh NAME
.Nm timerfd_create ,
.Nm timerfd_settime ,
.Nm timerfd_gettime
.Nd create and manipulate timers via a file descriptor interface
.Sh SYNOPSIS
.In sys/timerfd.h
.Ft int
.Fo timerfd_create
.Fa "int clockid"
.Fa "int flags"
.Fc
.Ft int
.Fo timerfd_settime
.Fa "int fd"
.Fa "int flags"
.Fa "const struct itimerspec *restrict value"
.Fa "struct itimerspec *restrict ovalue"
.Fc
.Ft int
.Fo timerfd_gettime
.Fa "int fd"
.Fa "struct itimerspec *value"
.Fc
.Sh DESCRIPTION
These routines create and manipulate timers in which events are associated
with a file descriptor, allowing for timer-based events to be used
in file-descriptor based facilities like
.Xr poll 2 ,
.Xr port_get 3C
or
.Xr epoll_wait 3C .
The
.Fn timerfd_create
function creates a timer with the clock
type specified by
.Fa clockid .
The
.Sy CLOCK_REALTIME
and
.Sy CLOCK_HIGHRES
clock types, as defined in
.Xr timer_create 3C ,
are supported by
.Fn timerfd_create .
(Note that
.Sy CLOCK_MONOTONIC
may be used as an alias for
.Sy CLOCK_HIGHRES Ns .)
.Pp
The
.Fa flags
argument specifies additional parameters for the timer instance, and can have
any of the following values:
.Bl -hang -width Ds
.It Sy TFD_CLOEXEC
.Bd -filled -compact
Instance will be closed upon an
.Xr exec 2 ;
see
.Xr open 2 Ns 's
description of
.Sy O_CLOEXEC .
.Ed
.It Sy TFD_NONBLOCK
.Bd -filled -compact
Instance will be set to be non-blocking.
A
.Xr read 2
on a
.Sy timerfd
instance that has been initialized with
.Sy TFD_NONBLOCK
will return
.Sy EAGAIN
in lieu of blocking if the
timer has not expired since the last
.Fn timerfd_settime
or successful
.Fn read .
.Ed
.El
.Pp
The following operations can be performed upon a
.Sy timerfd
instance:
.Bl -hang -width Ds
.It Sy read(2)
.Bd -filled -compact
Atomically reads and clears the number of timer expirations since the
last successful
.Xr read 2
or
.Fn timerfd_settime .
Upon success,
the number of expirations will be copied into the eight byte buffer
passed to the system call.
If there have been no expirations of the timer since the last successful
.Xr read 2
or
.Fn timerfd_sttime ,
.Xr read 2
will block until at least the next expiration,
or return
.Sy EAGAIN
if the instance was created with
.Sy TFD_NONBLOCK .
Note that if multiple threads are blocked in
.Xr read 2
for the same timer, only one of them will return upon
a single timer expiration.
.Pp
If the buffer specified to
.Xr read 2
is less than
eight bytes in length,
.Sy EINVAL
will be returned.
.Ed
.It Sy poll(2), port_get(3C), epoll_wait(3C)
.Bd -filled -compact
Provide notification when the timer expires or has expired in the past without
a more recent
.Xr read 2 .
Note that threads being simultaneously
blocked in
.Xr read 2
and
.Xr poll 2
(or equivalents) for the same
timer constitute an application-level race; on a timer expiration,
the thread blocked in
.Xr poll 2
may or may not return depending on how
it is scheduled with respect to the thread blocked in
.Xr read 2 .
.Ed
.It Sy timerfd_gettime()
.Bd -filled -compact
Returns the amount of time until the next timer expiration, with the
same functional signature and semantics as
.Xr timer_gettime 3C .
.Ed
.It Sy timerfd_settime()
.Bd -filled -compact
Sets or disarms the timer, with the
same functional signature and semantics as
.Xr timer_settime 3C .
.Ed
.El
.Sh RETURN VALUES
Upon successful completion, a file descriptor associated with the instance
is returned.
Otherwise,
.Sy -1
is returned and errno is set to indicate the error.
.Sh ERRORS
The
.Fn timerfd_create
function will fail if:
.Bl -tag -width Er
.It Er EINAL
The
.Fa flags
are invalid.
.It Er EMFILE
There are currently
.Pf { Sy OPEN_MAX Ns }
file descriptors open in the calling process.
.It Er EPERM
The
.Fa clock_id ,
is
.Sy CLOCK_HIGHRES
and the
.Pf { Sy PRIV_PROC_CLOCK_HIGHRES Ns }
is not asserted in the effective set of the calling process.
.El
.Sh SEE ALSO
.Xr poll 2 ,
.Xr epoll_wait 3C ,
.Xr port_get 3C ,
.Xr timer_create 3C ,
.Xr timer_gettime 3C ,
.Xr timer_settime 3C ,
.Xr privileges 7 ,
.Xr timerfd 7
